home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
v7n12.arc
/
SCANTD.C
< prev
next >
Wrap
Text File
|
1988-06-21
|
6KB
|
169 lines
/*
SCANTD.C Convert ASCII times and dates to binary
by Ray Duncan, February 1988
*/
#include <stdio.h>
#include <dos.h>
union REGS regs;
/* function prototypes */
static void getctry(void);
int scantime(char *, int *, int *, int *);
int scandate(char *, int *, int *, int *);
/* table of days of the month */
static int dom[] = { 31, /* January */
28, /* February */
31, /* March */
30, /* April */
31, /* May */
30, /* June */
31, /* July */
31, /* August */
30, /* September */
31, /* October */
30, /* November */
31 }; /* December */
static char cbuff[34]; /* receives country info */
static int cflag = 0; /* true if country info */
/* present in cbuff */
/*
Convert ASCII string into binary hour, minute, and second.
*/
int scantime(char *timestr, int *hour, int *min, int *sec)
{
*hour = *min = -1; /* force hours and minutes
to be entered */
*sec = 0; /* allow seconds to default
to zero */
/* validate time string */
if( strspn(timestr,"0123456789:") != strlen(timestr) )
return(0); /* exit if bad characters */
/* convert fields of input
using ':' as delimiter */
sscanf(timestr, "%d:%d:%d", hour, min, sec);
/* check all results against
allowed values and return
flag for overall conversion */
return( ( ( *hour>=0 ) && ( *hour<24 ) ) &&
( ( *min>=0 ) && ( *min<60 ) ) &&
( ( *sec>=0 ) && ( *sec<60 ) ) );
}
/*
Convert ASCII string into binary month, day, and year.
*/
int scandate(char *datestr, int *month, int *day, int *year)
{
char sep1[2],sep2[2]; /* these little arrays receive
date separators from scanf */
*month = *day = *year = -1; /* user must enter all fields */
/* now validate date string */
if( strspn(datestr,"0123456789/-.") != strlen(datestr) )
return(0); /* exit if bad characters */
getctry(); /* get country info */
/* convert fields of input
according to current
country, using '-', '/',
or '.' as delimiter */
switch(cbuff[0]) /* switch on date code */
{
case 0: /* USA: m d y */
sscanf(datestr, "%d%1s%d%1s%d", month, sep1, day, sep2, year);
break;
case 1: /* Europe: d m y */
sscanf(datestr, "%d%1s%d%1s%d", day, sep1, month, sep2, year);
break;
case 2: /* Japan: y m d */
sscanf(datestr, "%d%1s%d%1s%d", year, sep1, month, sep2, day);
break;
}
/* allow entry of complete year
and correct it if necessary */
if( (*year>=1980) && (*year<=1999) ) *year-=1900;
/* set up days of month table */
if( (*year%4) == 0 ) /* if leap year ... */
dom[1] = 29; /* then February = 29 days */
else dom[1] = 28; /* else February = 28 days */
/* check all results against
allowed values and return
flag for overall conversion */
return( ( ( *month>0 ) && ( *month<=12 ) ) &&
( ( *day>0 ) && ( *day<=dom[*month-1] ) ) &&
( ( *year>=80 ) && ( *year<=99 ) ) );
}
/*
Get MS-DOS internationalization information into
'cbuff', or provide default information.
*/
static void getctry(void)
{
int dosver;
if(cflag) return; /* exit if information
already in buffer */
memset(cbuff,0,34); /* initialize buffer */
regs.x.ax = 0x3000; /* get MS-DOS version */
int86(0x21, ®s, ®s);
dosver = regs.h.al;
if(dosver >= 2) /* if MS-DOS 2.x or 3.x */
{ /* get country info */
(char *) regs.x.dx = cbuff;
regs.x.ax = 0x3800;
int86(0x21, ®s, ®s);
}
if(dosver <= 2) /* if MS-DOS 1.x or 2.x */
{ /* force delimiter info */
cbuff[9] = '.'; /* decimal separator */
cbuff[11] = '/'; /* date separator */
cbuff[13] = ':'; /* time separator */
}
cflag = -1; /* we've been here before */
}